﻿/***************************************
 * author  : 박영규
 * history : 2005.03.
 ***************************************/

// form input 을 check 한다.
function checkForm(f, bJustCheck)
{
  	f = typeof f == "string" ? document.forms[f] : f;

  	var input;
  	for ( var n = 0, sz = f.elements.length; n < sz; n++ )
  	{
    	input = f.elements[n];
    	if ( ! input.name && ! input.id ) continue;

    	switch ( input.type )
    	{
      		case "button":
      		case "image":
      		case "submit":
      		case "reset": continue; break;
    	}

    	if ( ! checkInput(input, bJustCheck) ) return false;
  	}
  	return true;
}

// input 을 check 한다.
function checkInput(input, bJustCheck)
{ 
  	// 1. required 필수여부
  	// 2. minv, maxv
  	// 4. minbl, maxbl
  	// 5. email

  	input = typeof input == "string" ? $(input) : input;
  	var str = input.value;

  	var msg_prefix1 = input.korname ? input.korname +" 은(는) " : "";
  	var msg_prefix2 = input.korname ? input.korname +" 을(를) " : "";

  	if ( ["Y", "true"].include(input.required || input.key_field) && ! str )
  	{
    	if ( ! bJustCheck )
    	{
      		alert(msg_prefix2 + "입력해주세요.");
      		input_selectfocus(input);
    	}
    	return false;
  	}

  	if ( str )
  	{
    	if ( input.data_format && ! checkFormatInput(input, true) ) return false;


    	// 숫자에서만 사용
    	if ( input.minv && ! checkMinMaxVal(Number(getNormalValue(input)), Number(input.minv), null) )
    	{
      		if ( ! bJustCheck )
      		{
        		alert(msg_prefix2 + input.minv +" 이상으로 입력해주세요.");
        		input_selectfocus(input);
      		}
      		return false;
    	}

    	if ( input.maxv && ! checkMinMaxVal(Number(getNormalValue(input)), null, Number(input.maxv)) )
		{
   		 	if ( ! bJustCheck )
	      	{
	        	alert(msg_prefix2 + input.maxv +" 이하로 입력해주세요.");
	        	input_selectfocus(input);
	      	}	
	      	return false;
    	}

    	// 문자에서만 사용
    	if ( input.minbl && ! checkMinMaxByteLen(str, Number(input.minbl), null) )
    	{
	      	if ( ! bJustCheck )
	      	{	
	        	alert(msg_prefix2 + input.minbl +" byte(s) 이상으로 입력해주세요.(현재 "+getByteLength(str)+" byte(s))");
	        	input_selectfocus(input);
	      	}
	      	return false;
    	}

	    if ( input.maxbl && ! checkMinMaxByteLen(str, null, Number(input.maxbl)) )
	    {
	      	if ( ! bJustCheck )
	      	{
	        	alert(msg_prefix2 + input.maxbl +" byte(s) 이하로 입력해주세요.(현재 "+getByteLength(str)+" byte(s))");
	        	input_selectfocus(input);
	      	}	
	      	return false;
	    }
  	}
  	return true;
}

// 0보다 큰 체크...
function checkInputGT(input, number, bJustCheck)
{
  input = typeof input == "string" ? $(input) : input;
  var str = input.value;

  var msg_prefix1 = input.korname ? input.korname +" 은(는) " : "";
  var msg_prefix2 = input.korname ? input.korname +" 을(를) " : "";

  if ( number == null ) number = 0;

  if ( Number(getNormalValue(input)) <= number )
  {
    if ( ! bJustCheck )
    {
      alert(msg_prefix2 + number +" 커야 합니다.");
      input_selectfocus(input);
    }
    return false;
  }

  return checkInput(input, bJustCheck);
}

function checkInputNN(input, bJustCheck)
{
  input = typeof input == "string" ? $(input) : input;
  var str = input.value;

  var msg_prefix1 = input.korname ? input.korname +" 은(는) " : "";
  var msg_prefix2 = input.korname ? input.korname +" 을(를) " : "";

  if ( ! str )
  {
    if ( ! bJustCheck )
    {
      alert(msg_prefix2 + "입력해주세요.");
      input_selectfocus(input);
    }
    return false;
  }

  return checkInput(input, bJustCheck);
}

// 시작일, 종료일 input 을 check 한다.
function checkFromTo(inputFrom, inputTo)
{
  inputFrom = typeof inputFrom == "string" ? $(inputFrom) : inputFrom;
  inputTo = typeof inputTo == "string" ? $(inputTo) : inputTo;
  if ( inputFrom.value && inputTo.value )
  {
    if ( inputFrom.value > inputTo.value )
    {
      alert("구간을 정확히 입력해주세요.("+inputFrom.korname+" < "+inputTo.korname+")");
      input_selectfocus(inputTo);
      return false;
    }
  }
  return true;
}

// 최소값, 최대값을 체크한다.
function checkMinMaxVal(v, min, max)
{
  var check = true;
  if ( min != null ) check = v >= min;
  if ( ! check ) return false;
  if ( max != null ) check = v <= max;
  return check;
}

// 최소 최대 바이트 길이를 체크한다.
function checkMinMaxByteLen(str, min, max)
{
  var v = getByteLength(str);
  return checkMinMaxVal(v, min, max);
}

// 문자열의 바이트 킬이를 구한다.
function getByteLength(str)
{
  var rv = 0;
  for ( var n = 0, sz = str.length; n < sz; n++ )
  {
    rv += str.charCodeAt(n) > 0x00ff ? 2 : 1;
  }
  return rv;
}

// input 을 select 하고 focus 한다.
function input_selectfocus(input)
{
  input = typeof input == "string" ? $(input) : input;
  //try { input.blur(); } catch(e) {}
  try { input.select(); } catch(e) {}
  try { input.focus(); } catch(e) {}
}

//////////////////////////////
//                          //
//////////////////////////////
// 문자열을 포매팅한다.
function formatValue(str, data_format, pointCount, format)
{
  var rv = "";
  switch ( data_format )
  {
    case "dfDateYy":  rv = formatValueMask(str, "####"); break;
    case "dfDateMm":  rv = formatValueMask(str, "##"); break;
    case "dfDateYmd": rv = formatValueMask(str, "####-##-##"); break;
    case "dfDateYm":  rv = formatValueMask(str, "####-##"); break;
    case "dfDateMd":  rv = formatValueMask(str, "##-##"); break;

    case "dfTimeHms": rv = formatValueMask(str, "##:##:##"); break;
    case "dfTimeHm":  rv = formatValueMask(str, "##:##"); break;

    case "dfTimeYmdhms":  rv = formatValueMask(str, "####-##-## ##:##:##"); break;
    case "dfTimeYmdhm" :  rv = formatValueMask(str, "####-##-## ##:##"); break;

    case "dfIdNo":    rv = formatValueMask(str, "######-#######"); break;
    case "dfSaupNo":  rv = formatValueMask(str, "###-##-#####"); break;
    case "dfCardNo":  rv = formatValueMask(str, "####-####-####-####"); break;
    case "dfPostNo":  rv = formatValueMask(str, "###-###"); break;
    case "dfCorpNo":  rv = formatValueMask(str, "######-#######"); break;

    case "dfapprNo":  rv = formatValueMask(str, "##-###"); break;

	case "dfUserDefineNum":  rv = formatValueMask(str, format); break;
	case "dfUserDefine":  rv = formatValueMask2(str, format); break;

    case "dfNo":      rv = str.replace(/\D/g, ""); break;
    case "dfInteger+":rv = formatComma(str.replace(/\D/g, "")); break;
    case "dfInteger":
    {
      var sign = str.substr(0, 1) == "-" ? "-" : "";
      rv = sign + formatComma(str.replace(/\D/g, ""));
    }
    break;
    case "dfFloat+":
    {
      var pointidx = str.indexOf(".");
      var pointbelow = ( pointidx >= 0 ) ? "."+ str.substr(pointidx).replace(/\D/g, "") : "";
      var numvalue = formatComma(str.substr(0, pointidx >= 0 ? pointidx : str.length).replace(/\D/g, ""));
      if ( pointCount != null)
      {
        numvalue = numvalue == "" ? "0" : numvalue;
        pointbelow = rpad(pointbelow || ".", pointCount+1, "0");
      }
      rv = numvalue + pointbelow;
    }
    break;
    case "dfFloat":
    {
      var sign = str.substr(0, 1) == "-" ? "-" : "";
      var pointidx = str.indexOf(".");
      var pointbelow = ( pointidx >= 0 ) ? "."+str.substr(pointidx).replace(/\D/g, "") : "";
      var numvalue = formatComma(str.substr(0, pointidx >= 0 ? pointidx : str.length).replace(/\D/g, ""));
      if ( pointCount != null)
      {
        numvalue = numvalue == "" ? "0" : numvalue;
        pointbelow = rpad(pointbelow || ".", pointCount+1, "0");
      }
      rv = sign + (sign && pointbelow && ! numvalue ? "0" : numvalue) + pointbelow;
    }
    break;

    //case "dfEmail":
    default:          rv = str; break;
  }

  return rv;
}

// 포맷을 체크한다.
function checkFormatInput(input, bShowMsg)
{
  input = typeof input == "string" ? $(input) : input;
  var check = checkFormatValue(input.value, input.data_format);
  if ( ! check && bShowMsg )
  {
    alert( (input.korname ? input.korname+" 은(는) " : "") + getFormatErrMsg(input.data_format));
    input_selectfocus(input);
  }
  return check;
}

// 문자열이 format 에 맞는지 검사한다.
function checkFormatValue(str, data_format, bShowMsg)
{
  var numstr;
  var check = false;
  switch ( data_format )
  {
    case "dfDateYy":  check = /^\d{4}$/.test(str); break;
    case "dfDateMm":
    {
      check = /^\d{2}$/.test(str);
      if ( ! check ) break;
      var mm = Number(str.substr(0, 2));//-1 안함
      check = between(mm, 1, 12);
    }
    break;
    case "dfDateYmd":
    {
      check = /^\d{4}\-\d{2}\-\d{2}$/.test(str);
      if ( ! check ) break;
      numstr = str.replace(/\D/g, "");
      var yy = Number(numstr.substr(0, 4));
      var mm = Number(numstr.substr(4, 2))-1;
      var dd = Number(numstr.substr(6, 2));
      var dt = new Date(yy, mm, dd);
      check = yy == dt.getFullYear() && mm == dt.getMonth() && dd == dt.getDate();
    }
    break;
    case "dfDateYm":
    {
      check = /^\d{4}\-\d{2}$/.test(str);
      if ( ! check ) break;
      numstr = str.replace(/\D/g, "");
      var mm = Number(numstr.substr(4, 2));//-1 안함
      check = between(mm, 1, 12);
    }
    break;
    case "dfDateMd":
    {
      check = /^\d{2}\-\d{2}$/.test(str);
      if ( ! check ) break;
      numstr = str.replace(/\D/g, "");
      var mm = Number(numstr.substr(0, 2));//-1 안함
      var dd = Number(numstr.substr(2, 2));
      check = between(mm, 1, 12);
      if ( ! check ) break;
      return mm == 1 ? between(dd, 1, 31) :
             mm == 2 ? between(dd, 1, 29) ://<--
             mm == 3 ? between(dd, 1, 31) :
             mm == 4 ? between(dd, 1, 30) :
             mm == 5 ? between(dd, 1, 31) :
             mm == 6 ? between(dd, 1, 30) :
             mm == 7 ? between(dd, 1, 31) :
             mm == 8 ? between(dd, 1, 31) :
             mm == 9 ? between(dd, 1, 30) :
             mm ==10 ? between(dd, 1, 31) :
             mm ==11 ? between(dd, 1, 30) :
             mm ==12 ? between(dd, 1, 31) : false;
    }
    break;
    case "dfTimeHms":
    {
      check = /^\d{2}:\d{2}:\d{2}$/.test(str);
      if ( ! check ) break;
      numstr = str.replace(/\D/g, "");
      var hh = Number(numstr.substr(0, 2));
      var mi = Number(numstr.substr(2, 2));
      var ss = Number(numstr.substr(4, 2));
      check = between(hh, 0, 23) && between(mi, 0, 59) && between(ss, 0, 59);
    }
    break;
    case "dfTimeHm":
    {
      check = /^\d{2}:\d{2}$/.test(str);
      if ( ! check ) break;
      numstr = str.replace(/\D/g, "");
      var hh = Number(numstr.substr(0, 2));
      var mi = Number(numstr.substr(2, 2));
      check = between(hh, 0, 23) && between(mi, 0, 59);
    }
    break;
    case "dfTimeYmdhms":
    {
      check = /^\d{4}\-\d{2}\-\d{2}[ ]\d{2}:\d{2}:\d{2}$/.test(str);
      if ( ! check ) break;
      numstr = str.replace(/\D/g, "");
      var yy = Number(numstr.substr(0, 4));
      var mm = Number(numstr.substr(4, 2))-1;
      var dd = Number(numstr.substr(6, 2));
      var dt = new Date(yy, mm, dd);
      check = yy == dt.getFullYear() && mm == dt.getMonth() && dd == dt.getDate();
      if ( ! check ) break;

      var hh = Number(numstr.substr(8, 2));
      var mi = Number(numstr.substr(10, 2));
      var ss = Number(numstr.substr(12, 2));
      check = between(hh, 0, 23) && between(mi, 0, 59) && between(ss, 0, 59);
    }
    break;
    case "dfIdNo":
    {
      check = /^\d{6}-\d{7}$/.test(str);
      if ( ! check ) break;
      check = checkJuminNo(restoreValue(str, data_format));
      if ( ! check )
      {
        if ( confirm("주민번호 형식이 맞지 않습니다. 계속 진행하시겠습니까?") ) check = true;
        else break;
      }
    }
    break;
    case "dfSaupNo":
    {
      check = /^\d{3}-\d{2}-\d{5}$/.test(str);
      if ( ! check ) break;
      check = checkSaupNo(restoreValue(str, data_format));
      if ( ! check )
      {
        if ( confirm("사업자번호 형식이 맞지 않습니다. 계속 진행하시겠습니까?") ) check = true;
        else break;
      }
    }
    break;
    case "dfCorpNo":  check = /^\d{6}-\d{7}$/.test(str); break;
    case "dfapprNo":  check = /^\d{2}-\d{3}$/.test(str); break;
    case "dfCardNo":  check = /^\d{4}-\d{4}-\d{4}-\d{4}$/.test(str); break;
    case "dfPostNo":  check = /^\d{3}-\d{3}$/.test(str); break;

    case "dfNo":      check = /^\d+$/.test(str); break;
    case "dfInteger+":check = /^0|([1-9]\d*)$/.test(restoreValue(str, data_format)); break;
    case "dfInteger": check = /^-?(0|([1-9]\d*))$/.test(restoreValue(str, data_format)); break;
    case "dfFloat+":  check = /^(0|([1-9]\d*))(\.\d*)?$/.test(restoreValue(str, data_format)); break;
    case "dfFloat":   check = /^-?(0|([1-9]\d*))(\.\d*)?$/.test(restoreValue(str, data_format)); break;

    case "dfEmail":   check = /^[^@]+@[^@]+$/.test(str);
    default:          check = true; break;
  }

  if ( ! check && bShowMsg )
  {
    alert(getFormatErrMsg(data_format));
  }

  return check;

}

// 에러메시지
function getFormatErrMsg(data_format)
{
  var rv = "";
  switch ( data_format )
  {
    case "dfDateYy":  rv = "올바른 날짜(년도) 형식이 아닙니다."; break;
    case "dfDateMm":  rv = "올바른 날짜(월) 형식이 아닙니다."; break;
    case "dfDateYmd": rv = "올바른 날짜(년월일) 형식이 아닙니다."; break;
    case "dfDateYm":  rv = "올바른 날짜(년월) 형식이 아닙니다."; break;
    case "dfDateMd":  rv = "올바른 날짜(월일) 형식이 아닙니다."; break;

    case "dfTimeHms": rv = "올바른 시간(시분초) 형식이 아닙니다."; break;
    case "dfTimeHm":  rv = "올바른 시간(시분) 형식이 아닙니다."; break;

    case "dfTimeYmdhms": rv = "올바른 시간(년월일시분초) 형식이 아닙니다."; break;

    case "dfIdNo":    rv = "올바른 주민번호 형식이 아닙니다."; break;
    case "dfSaupNo":  rv = "올바른 사업자번호 형식이 아닙니다."; break;
    case "dfCardNo":  rv = "올바른 카드번호 형식이 아닙니다."; break;
    case "dfPostNo":  rv = "올바른 우편번호 형식이 아닙니다."; break;
    case "dfCorpNo":  rv = "올바른 법인등록번호 형식이 아닙니다."; break;
    case "dfapprNo":  rv = "올바른 조합인가번호 형식이 아닙니다."; break;

    case "dfNo":      rv = "올바른 번호 형식이 아닙니다."; break;
    case "dfInteger+":rv = "올바른 숫자(양의 정수) 형식이 아닙니다."; break;
    case "dfInteger": rv = "올바른 숫자(정수) 형식이 아닙니다."; break;
    case "dfFloat+":  rv = "올바른 숫자(양의 실수) 형식이 아닙니다."; break;
    case "dfFloat":   rv = "올바른 숫자(실수) 형식이 아닙니다."; break;

    case "dfEmail":   rv = "올바른 이메일 형식이 아닙니다."; break;
    default:          rv = "올바른 형식이 아닙니다."; break;
  }

  return rv;
}

// DB에 넣을 값을 가져온다.
function restoreValue(str, data_format)
{
  var rv = "";
  switch ( data_format )
  {
    //case "dfDateYy":
    //case "dfDateMm":
    case "dfDateYmd":
    case "dfDateYm":
    case "dfDateMd":

    case "dfTimeHms":
    case "dfTimeHm":

    case "dfTimeYmdhms":

    case "dfIdNo":
    case "dfSaupNo":
    case "dfCardNo":
    case "dfPostNo":  rv = str.replace(/\D/g, ""); break;
    case "dfCorpNo":
    case "dfapprNo":

    //case "dfNo":
    case "dfInteger+":
    case "dfInteger":
    case "dfFloat+":
    case "dfFloat":   rv = str.replace(/,/g, ""); break;

    //case "dfEmail":
    default:          rv = str; break;
  }
  return rv;

}

// display 용 값이 아닌 DB에 넣을 값을 가져온다.
function getNormalValue(input, data_format)
{
  input = typeof input == "string" ? $(input) : input;
  return restoreValue(input.value, nvl(data_format, input.data_format));
}

// input 을 format 한다.
function formatInput(input, data_format)
{
 
  	input = typeof input == "string" ? $(input) : input;
 
	var dataFormat = nvl(data_format, input.data_format)
  	if ( dataFormat == "dfUserDefineNum" || dataFormat == "dfUserDefine" )
  	{	
   		input.value = formatValue(input.value, dataFormat ,null, input.getAttribute("dataType"));
  	}else{
  		input.value = formatValue(input.value, dataFormat);  		
	}
}

function inputSetFormatValue(input, str, data_format)
{
  input = typeof input == "string" ? $(input) : input;
  input.value = formatValue(str, nvl(data_format, input.data_format));
}

// input value 세팅할 때 type 이나 data_format 에 맞게 자동으로 세팅
function inputSetValueAuto(input, str, data_format, default_value)
{
  var orgInput = input;
  if ( typeof input == "string" ) input = $(input);
  if ( input == null ) alert("inputSetValueAuto: input("+input+","+orgInput+") is not defined...");

  if ( default_value != null && (str == null || str == "")) str = default_value;

  str = String(str);

  // if radio
  if ( input.length && input[0].type == "radio")
    for ( var n = 0, nsz = input.length; n < nsz; n++ )
      input[n].checked = input[n].value == str;

  switch ( input.tagName )
  {
    case "SELECT": setSelect(input, str); break;
    case "INPUT":
    {
      if ( input.type == "checkbox" || input.type == "radio")
        input.checked = input.value == str;
      else if ( input.data_format )
        inputSetFormatValue(input, str, input.data_format);
      else
        input.value = str;
    }
    break;
    default: input.value = str; break;
  }

}

getUnformat = getNormalValue;
formatThis = formatInput;
// util //////////////////////////////////////////////////////////////////////////////////

// 형식화된 숫자형식을 formatting
function formatValueMask(str, format)
{ 
  	var rv = "";
 
  	var numcount = countChr(format, '#');
  	str = str.replace(/\D/g, "").substr(0, numcount);
  	var chrAt;
  	var validx = 0;
  	for ( var n = 0; n < format.length; n++ )
  	{
	    chrAt = format.charAt(n);
    	rv += ( chrAt == '#' ) ? str.charAt(validx++) : chrAt;
    	if ( validx >= str.length ) break;
  	}
  	return rv;
}
 

// 형식화된 숫자형식을 formatting
function formatValueMask2(str, format)
{ 
  	var rv = "";
 
  	var numcount = countChr(format, '*');
  	str = str.replace(/[\*\/\-:_|]/g, "").substr(0, numcount);
  	var chrAt;
  	var validx = 0;
  	for ( var n = 0; n < format.length; n++ )
  	{
	    chrAt = format.charAt(n);
    	rv += ( chrAt == '*' ) ? str.charAt(validx++) : chrAt;
    	if ( validx >= str.length ) break;
  	}
  	return rv;
}


// str 에서 chr 포함 갯수
function countChr(str, chr)
{
  	var count = 0;
  	var length = str.length;
  	for ( var n = 0; n < length; n++ )
  	{
    	if ( chr == str.charAt(n) ) count++;
  	}
  	return count;
}

// 컴마를 붙인다.
// numstr 은 반드시 number string
function formatComma(numstr)
{
	numstr = deletePrecedingZero(numstr.replace(/\D/g, ""));// 선행하는 zero 를 지운다.
	var rv = "";
	var idx = 0;
	for ( var n = numstr.length - 1; n >= 0; n-- )
	{
		if ( idx != 0 && idx % 3 == 0 ) rv = "," + rv;
		rv = numstr.charAt(n) + rv;
	    idx++;
	}
	return rv;
}

// oracle between
function between(val, from, to)
{
	return val >= from && val <= to;
}

// 주민등록번호 체크
function checkJuminNo(numstr)
{
  	if ( ! /^\d{13}$/.test(numstr) ) return false;

  	return checkKoreanJuminNo(numstr) || checkForeignJuminNo(numstr);
}

function checkKoreanJuminNo(numstr)
{
  	var cBit = 0;
  	var sCode="234567892345";

  	for ( var n = 0; n < 12; n++)
  	{
    	cBit += Number(numstr.charAt(n)) * Number(sCode.charAt(n));
  	}

  	cBit = 11 - ( cBit % 11);
  	cBit = cBit % 10;

  	return Number(numstr.charAt(12)) == cBit;
}

function checkForeignJuminNo(numstr)
{
  	var sum=0;
  	var odd=0;
  	buf = new Array(13);
  	for(i=0; i<13; i++) { buf[i] = Number(numstr.charAt(i)); }
  	odd = buf[7]*10 + buf[8];
  	if(odd%2 != 0) { return false; }
  	if( (buf[11]!=6) && (buf[11]!=7) && (buf[11]!=8) && (buf[11]!=9) ) {
    	return false;
  	}	
  	var multipliers = [2,3,4,5,6,7,8,9,2,3,4,5];
  	for(i=0, sum=0; i<12; i++) { sum += (buf[i] *= multipliers[i]); }
  	sum = 11 - (sum%11);
  	if(sum >= 10) { sum -= 10; }
  	sum += 2;
  	if(sum >= 10) { sum -= 10; }
  	if(sum != buf[12]) { return false }
  	return true;
}


// 사업자등록번호 체크
function checkSaupNo(numstr)
{
  if ( ! /^\d{10}$/.test(numstr) ) return false;

  var sCode = "137137135";

  var sum = 0;
  for ( var n = 0; n < 9; n++)
  {
    sum += Number(numstr.charAt(n)) * Number(sCode.charAt(n));
  }

  sum += parseInt(Number(numstr.charAt(8)) * 5 / 10);

  var sidliy = sum % 10;
  var sidchk = ( sidliy != 0 ) ? 10 - sidliy : 0;

  return sidchk == Number(numstr.charAt(9));
}

// oracle decode
function decode(s)
{
  var idx = 1;
  while ( idx < arguments.length - 1 )
  {
    if ( s == arguments[idx] )
    {
      return arguments[idx+1];
    }
    else
    {
      if ( idx+2 == arguments.length - 1)
      {
        return arguments[idx+2];
      }
    }
    idx += 2;
  }
  return null;
}

// 선행 0 제거
function deletePrecedingZero(numstr)
{
  var replaced = numstr.replace(/^0+/, "");
  return numstr && ! replaced ? "0" : replaced;
}

// 텍스트정렬, 한영입력, 최대글자수제한 style 적용
function applyStyle(e, textAlign, imeMode, maxLength)
{
  if ( textAlign != null ) e.runtimeStyle.textAlign = textAlign;
  if ( imeMode != null ) e.runtimeStyle.imeMode = imeMode;
  if ( maxLength != null )
  {
    //e.size = (maxLength-1);
    e.maxLength = maxLength;
  }
}

// max 값을 가져온다.
function max()
{
  var rv = null;
  for ( var n = 0; n < arguments.length; n++ )
  {
    if ( rv == null || arguments[n] > rv )
    {
      rv = arguments[n];
    }
  }
  return rv;
}

// min 값을 가져온다.
function min()
{
  var rv = null;
  for ( var n = 0; n < arguments.length; n++ )
  {
    if ( rv == null || arguments[n] < rv )
    {
      rv = arguments[n];
    }
  }
  return rv;
}

// 평균값을 가져온다.
function avg()
{
  var sum = 0;
  for ( var n = 0; n < arguments.length; n++ )
  {
    sum += arguments[n];
  }
  return arguments.length == 0 ? 0 : sum / arguments.length;
}

// form 의 포맷값들을 자동으로 unformat 객체가 없으면 자동생성
function inputAutoUnformat(form, f, s)
{
  form = form || document.forms[0];
  f = f == null ? "F" : f;
  s = s == null ? "S" : s;
  var f_ = f + "_";
  var s_ = s + "_";
  $A(form.document.getElementsByTagName("INPUT")).select(function(e)
  {
    return e.name && e.name.startsWith(f_);
  }).each(function(e)
  {
    var s_name = s_ + e.name.substr(f_.length);
    if ( form[s_name] == null )
    {
      form.appendChild(form[s_name] = $E("input", {name: s_name, type: "hidden"}));
    }
    form[s_name].value = getUnformat(e);
  });
}
/*
function makeInputFormatAll()
{
  $A(document.getElementsByTagName("INPUT")).each(function (input, index)
  {
    if ( input.data_format )
    {
      switch ( input.data_format )
      {
        case "dfDateYy":  applyStyle(input, "center", "disabled", "####".length); break;
        case "dfDateMm":  applyStyle(input, "center", "disabled", "##".length); break;
        case "dfDateYmd": applyStyle(input, "center", "disabled", "####-##-##".length); break;
        case "dfDateYm":  applyStyle(input, "center", "disabled", "####-##".length); break;
        case "dfDateMd":  applyStyle(input, "center", "disabled", "##-##".length); break;

        case "dfTimeHms": applyStyle(input, "center", "disabled", "##:##:##".length); break;
        case "dfTimeHm":  applyStyle(input, "center", "disabled", "##:##".length); break;

        case "dfTimeYmdhms": applyStyle(input, "center", "disabled", "####-##-## ##:##:##".length); break;

        case "dfIdNo":    applyStyle(input, "center", "disabled", "######-#######".length); break;
        case "dfSaupNo":  applyStyle(input, "center", "disabled", "###-##-#####".length); break;
        case "dfCardNo":  applyStyle(input, "center", "disabled", "####-####-####-####".length); break;
        case "dfPostNo":  applyStyle(input, "center", "disabled", "###-###".length); break;

        case "dfNo":
        case "dfInteger+":
        case "dfInteger":
        case "dfFloat+":
        case "dfFloat":   applyStyle(input, "right", "disabled", null); break;
      }

      input.attachEvent("onkeyup", function() {
        switch ( event.keyCode )
        {
          case Event.KEY_BACKSPACE:
          case Event.KEY_TAB:
          case Event.KEY_RETURN:
          case Event.KEY_ESC:
          case Event.KEY_LEFT:
          case Event.KEY_UP:
          case Event.KEY_RIGHT:
          case Event.KEY_DOWN:
          case Event.KEY_DELETE:
          case Event.KEY_HOME:
          case Event.KEY_END:
          case Event.KEY_PAGEUP:
          case Event.KEY_PAGEDOWN: return;
        }
        formatThis(input);
      });

      input.attachEvent("onfocus", function() {
        input.select();
      });
    }
  });
}
*/
function lastDay(ym)
{
  var ymd = addYmd(ym.substr(0, 6)+"01", "M", 1);
  return addYmd(ymd, "D", -1);
}

function makeYmdToDate(ymd)
{
  var yy = Number(numstr.substr(0, 4));
  var mm = Number(numstr.substr(4, 2))-1;
  var dd = Number(numstr.substr(6, 2));
  return new Date(yy, mm, dd);
}